﻿Public Class CLabelCheckState : Inherits CStateBase

    ''' <summary>
    ''' 実行可能かを判断する
    ''' </summary>
    ''' <param name="task"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function IsEnter(ByVal task As CTaskBase) As Boolean
        Debug.WriteLine("CLabelCheckState.IsEnter")
        If CCommon.isInStr(task.ActionCd, "SHIPTOLABEL", "LABEL", "CHNG") Then
            Return True
        Else
            Return False
        End If
    End Function

    ''' <summary>
    ''' 実行メソッド
    ''' </summary>
    ''' <param name="task"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function DoExecute(ByVal task As CTaskBase) As CStateBase
        Dim nextState As CStateBase = Nothing
        Dim pdaTask As CPDATask = DirectCast(task, CPDATask)
        Dim webMng As CWebManager = CWebManager.GetInstance
        Dim AppManager As CApplicationManager = CApplicationManager.GetInstance

        'データベース接続
        Dim app As CApplication = CApplication.GetInstance()
        Dim sql As CSQLite = app.MasterDB()
        Dim trx As CTransaction = sql.GetTransaction
        Dim StateDao As CMasterDAO = New CMasterDAO
        Dim checkLblData As CCheck = CCheck.GetIns

        Try
            'バーコードを読んで値を設定しにCValueStateに行くLogicSTART------------------------------------------------------------->>>
            If task.ProcessText = "" Then
                'メッセージ表示部分
                If pdaTask.MsgText = "" Then
                    pdaTask.WindowManager.SetMessage(CConst.CNS_MSG_031, CConst.COLOR_BLACK, CConst.COLOR_GREEN)
                Else
                    'pdaTask.MsgText = "次:" & pdaTask.MsgText & vbCrLf & "を読んでください。"
                    pdaTask.WindowManager.SetMessage(pdaTask.MsgText, CConst.COLOR_BLACK, CConst.COLOR_GREEN)
                End If
                '街状態
                task.ProcessText = task.ReadTextWait(-1)

                '取消コード
                If task.ProcessText.StartsWith(CConst.CNS_END) Then
                    '全作業を削除
                    CPersonal.ErrorLock2Release(pdaTask)

                    '終了コード読むとき
                ElseIf task.ProcessText.StartsWith(CConst.CNS_END_LABEL) Then

                    pdaTask.WindowManager.SetMessage(CConst.CNS_MSG_055, CConst.COLOR_BLACK, CConst.COLOR_GREEN)

                    'メモリに保存されたデータも消す
                    checkLblData.InsertOk()

                    '送信したら送信フラグをUPDATE
                    Dim updateInt As Integer = trx.UpdateSQL("update lblData_tbl set is_ok = 'OK' where is_ok = '0'")
                    Dim updateInt2 As Integer = trx.UpdateSQL("update lblData_detail set is_ok = 'OK' where is_ok = '0'")
                    Dim updateInt3 As Integer = trx.UpdateSQL("update unique_lblData set is_ok = 'OK' where is_ok = '0'")

                    Debug.WriteLine("終了コード読みました。")
                    'CPersonal.LabelDataSend(pdaTask)
                    checkLblData.initAllData()

                    pdaTask.WindowManager.BaseRelease()
                    pdaTask.WindowManager.CloseWindow()

                End If

                '取消の場合---------------------------------------->>START
                If task.ProcessText.StartsWith(CConst.CANCEL_OK) Then
                    'MessageBox.Show("取消に行く")
                    task.ActionCd = "CANCEL"
                    task.ProcessText = ""
                    nextState = GetNextState(task)
                    Return nextState
                ElseIf task.ProcessText.StartsWith(CConst.CANCEL_NO) Then
                    '照合中には取消が出来ないように
                    CPersonal.ErrorWindow(pdaTask, EnumWindowMode.ALERT_MODE, _
                                Color.Black, CConst.EnumSound.ALERT_BUZZ, CConst.CNS_MSG_046, Color.White)

                    task.ActionCd = "LABEL"
                    task.ProcessText = ""
                    nextState = GetNextState(task)
                    Return nextState

                End If
                '取消の場合---------------------------------------->>END
                
                pdaTask.ReadText = task.ProcessText
                '読んだバーコード種類
                Dim barCdType As String = StateDao.CheckBarCdType(trx, task.ProcessText)
                'MessageBox.Show("barType:" & barCdType)
                'パタンを決める------>START
                If (task.ProcessText = "[OK]" And CCommon.FlagManage("LABEL_OK")) Then
                    'MessageBox.Show("FlagManage(OK)")
                    'MessageBox.Show("pdaTask.PartLabelQty:" & pdaTask.PartLabelQty)
                    'MessageBox.Show("pdaTask.ChdLabelQty:" & pdaTask.ChdLabelQty)
                    CCommon.FlagManage("LABEL_OK", False)
                    Dim retResult As Boolean = True
                    If pdaTask.PartLabelQty <> pdaTask.ChdLabelQty And CCommon.FlagManage("READ_EMORE") Then
                        If Not CPersonal.ConfirmWindow(pdaTask, EnumWindowMode.YESNO_MODE, _
                                        Color.Black, CConst.EnumSound.ALERT_BUZZ, CConst.CNS_MSG_040, Color.White) Then
                            retResult = False
                        End If
                    End If
                    If retResult Then
                        CPersonal.AddParentLabel(pdaTask)
                        '完全に照合成功
                        task.ActionCd = "LABEL-IN"
                        pdaTask.MsgText = ""
                        pdaTask.EndFlg = "1"
                    Else
                        task.ActionCd = "LABEL"
                    End If
                    nextState = GetNextState(task)
                    Return nextState
                Else
                    If task.ProcessText = "[OK]" Then
                        task.ActionCd = "LABEL"
                        nextState = GetNextState(task)
                        Return nextState
                    End If
                End If

                '不明なラベルはエラー ErrorChk---------------------------------------START>>>>
                If barCdType = "" Then
                    'エラー(設定によってエラーロックか警告でするか)
                    If pdaTask.PatternList.Count > 1 Then
                        If AppManager.m_AppSetting.ErrorChk Then
                            CPersonal.ErrorWindow(pdaTask, EnumWindowMode.ALERT_MODE, _
                                                Color.White, CConst.EnumSound.ERR_BUZZ, CConst.CNS_MSG_034, Color.Red)
                            CPersonal.ErrorLock(pdaTask)
                            'エラーになったら全部照合中のデータは全部戻す（初期化）
                        Else
                            CPersonal.ErrorWindow(pdaTask, EnumWindowMode.ALERT_MODE, _
                                                Color.Black, CConst.EnumSound.ALERT_BUZZ, CConst.CNS_MSG_007, Color.White)
                            CPersonal.ErrorLock2Release(pdaTask)
                        End If
                    Else
                        'ただの警告
                        CPersonal.ErrorWindow(pdaTask, EnumWindowMode.ALERT_MODE, _
                                     Color.Black, CConst.EnumSound.ALERT_BUZZ, CConst.CNS_MSG_007, Color.White)
                    End If
                    task.ActionCd = "LABEL"
                    task.ProcessText = ""
                    nextState = GetNextState(task)
                    ''修正10.08.26 START
                    Return nextState
                    ''修正10.08.26 END

                Else
                    'Dim barNm As String = StateDao.GetBarcdName(trx, barCdType)
                    ''ボタン追加
                    'pdaTask.WindowManager.AddActionLabel(barNm, Color.GreenYellow)
                End If
                'MessageBox.Show("barCdType:" & barCdType)
                '不明なラベルはエラー ErrorChk---------------------------------------END>>>>
                '照合パタン検索時---------------------------->>
                If pdaTask.PatternList.Count = 0 Then
                    pdaTask.LabelCount = 1
                    'パタン種類を取得
                    pdaTask.PatternList = StateDao.GetPatternNm(trx, barCdType, pdaTask.LabelCount, "1")
                    'MessageBox.Show("pdaTask.PatternList.Count:" & pdaTask.PatternList.Count)
                    If pdaTask.PatternList.Count = 0 Then
                        CPersonal.ErrorWindow(pdaTask, EnumWindowMode.ALERT_MODE, _
                                      Color.Black, CConst.EnumSound.ALERT_BUZZ, CConst.CNS_MSG_007, Color.White)
                        'エラーになったら全部照合中のデータは全部戻す（初期化）
                        CPersonal.ErrorLock(pdaTask)
                        task.ActionCd = "LABEL"
                        task.ProcessText = ""
                        nextState = GetNextState(task)
                        Return nextState
                    End If

                    'ラベル読んだのが最初ではない
                Else
                    'パタンを絞る
                    Dim newPattern As ArrayList = New ArrayList
                    For i As Integer = 0 To pdaTask.PatternList.Count - 1
                        Dim pattern As String = pdaTask.PatternList(i)
                        Dim nxtLbl As String = StateDao.GetNextLabel(trx, pattern, pdaTask.LabelCount)
                        If barCdType = nxtLbl Then
                            newPattern.Add(pattern)
                        End If
                    Next

                    '別の照合パタン検索
                    If newPattern.Count = 0 And pdaTask.LabelCount > 1 Then
                        If AppManager.m_AppSetting.ErrorChk Then
                            CPersonal.ErrorWindow(pdaTask, EnumWindowMode.ALERT_MODE, _
                                                         Color.White, CConst.EnumSound.ERR_BUZZ, CConst.CNS_MSG_034, Color.Red)
                            'エラーになったら全部照合中のデータは全部戻す（初期化）
                            CPersonal.ErrorLock(pdaTask)
                        Else
                            CPersonal.ErrorWindow(pdaTask, EnumWindowMode.ALERT_MODE, _
                                                         Color.Black, CConst.EnumSound.ALERT_BUZZ, CConst.CNS_MSG_007, Color.White)
                            CPersonal.ErrorLock2Release(pdaTask)
                        End If
                        task.ActionCd = "LABEL"
                        task.ProcessText = ""
                        nextState = GetNextState(task)
                        Return nextState

                    ElseIf newPattern.Count = 0 Then
                        '最初何も決めれない状態
                        'パタン種類を取得
                        pdaTask.PatternList = StateDao.GetPatternNm(trx, barCdType, pdaTask.LabelCount, "1")
                        'MessageBox.Show("pdaTask.PatternList.Count:" & pdaTask.PatternList.Count)
                        If pdaTask.PatternList.Count = 0 Then
                            CPersonal.ErrorWindow(pdaTask, EnumWindowMode.ALERT_MODE, _
                                          Color.Black, CConst.EnumSound.ALERT_BUZZ, CConst.CNS_MSG_007, Color.White)
                            'エラーになったら全部照合中のデータは全部戻す（初期化）
                            CPersonal.ErrorLock(pdaTask)
                            task.ActionCd = "LABEL"
                            task.ProcessText = ""
                            nextState = GetNextState(task)
                            Return nextState
                        End If

                    Else
                        '既存のパタンは削除
                        pdaTask.PatternList.Clear()
                        '絞ったパタン
                        pdaTask.PatternList = newPattern
                    End If
                End If

                '照合パタン検索時---------------------------->>
                task.ActionCd = "VALUE_CHECK"
                nextState = GetNextState(task)
                Return nextState

                'バーコードを読んで値を設定しにCValueStateに行くLogicEND------------------------------------------------------------->>>
            Else

                'CValueSTATEでチェックが終わってから来る-------------------->>>>
                Dim typeChoice As Boolean = True
                '値を設定してINNER_STATEに行く
                '読んだバーコード種類
                Dim barCdType As String = StateDao.CheckBarCdType(trx, task.ProcessText)
                If pdaTask.PatternList.Count = 1 Then
                    '最後のラベルの場合
                    Dim nextLbl As CResultSet = StateDao.GetNextCResult(trx, pdaTask.PatternList(0), pdaTask.LabelCount)
                    Dim nextLblNm As String = nextLbl.GetString("label_type")
                    'MessageBox.Show("nextLblNm:^>" & nextLblNm)
                    'MessageBox.Show("READ_EMORE:^>" & CCommon.FlagManage("READ_EMORE"))
                    If nextLblNm = "" Then
                        If Not CCommon.FlagManage("READ_EMORE") Then
                            task.ActionCd = "LABEL-IN"
                            pdaTask.MsgText = ""
                            'pdaTask.Hardware.nextC()
                            pdaTask.EndFlg = "1"
                        Else
                            Dim preLbl As CResultSet = StateDao.GetNextCResult(trx, pdaTask.PatternList(0), pdaTask.LabelCount - 1)
                            '自分が複数が出来ないならそのまま終わり
                            If preLbl.GetString("lbl_count") = "N" Then
                                task.ActionCd = "LABEL-IN"
                                pdaTask.MsgText = ""
                                'pdaTask.Hardware.nextC()
                                pdaTask.EndFlg = "1"
                            Else
                                task.ActionCd = "LABEL"
                                task.ProcessText = ""
                            End If
                        End If
                    Else
                        task.ActionCd = "LABEL"
                        task.ProcessText = ""
                    End If
                    'MessageBox.Show("pdaTask.ActionQty::" & pdaTask.ActionQty)
                Else
                    task.ActionCd = "LABEL"
                    task.ProcessText = ""
                End If

                'ラベル追加
                CPersonal.AddLabelList(pdaTask, task.ProcessText, barCdType)
            End If

        Catch ex As Exception
            'MessageBox.Show("LabelCheckエラー:" & ex.Message)
        End Try

        nextState = GetNextState(task)
        Return nextState
       
    End Function

    ''' <summary>
    ''' 終了メソッド(未使用)
    ''' </summary>
    ''' <param name="task"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function DoExit(ByVal task As CTaskBase) As Boolean
        Debug.WriteLine("CLabelCheckState.DoExit")
        Return True
    End Function

End Class
